package com.dkd.day20250718;

import java.util.Scanner;

public class Main27 {
    public static void main(String[] args) {
        //给定一个 N 行 M 列的二维矩阵，矩阵中每个位置的数字取值为 0 或 1。矩阵示例如：1 1 0 00 0 0 10 0 1 11 1 1 1
        // 现需要将矩阵中所有的 1 进行反转为 0，规则如下：当点击一个 1 时，该 1 便被反转为0，
        // 同时相邻的上、下、左、右，以及左上、左下、右上、右下 8 个方向的 1（如果存在1）均会自动反转为 0
        // 进一步地，一个位置上的 1 被反转为0时，与其相邻的 8 个方向的 1（如果存在1）均会自动反转为0
        // 按照上述规则示例中的矩阵只最少需要点击 2 次后，所有值均为 0。请问，给定一个矩阵，最少需要点击几次后，所有数字均为 0？
        //
        //输入描述
        //第一行为两个整数，分别表示句子的行数 N 和列数 M，取值范围均为 [1, 100]
        //
        //接下来 N 行表示矩阵的初始值，每行均为 M 个数，取值范围 [0, 1]

        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        int[][] arr = new int[n][m];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                arr[i][j] = sc.nextInt();
            }
        }

        solve(n, m, arr);
    }

    static int[][] offs ={{0,1},{1,0},{0,-1},{-1,0},{-1,1},{1,1},{-1,-1},{1,-1}};

    public static void solve(int n, int m,int [][] arr) {

        int count = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (arr[i][j] == 1) {
                    arr[i][j] = 0;
                    count ++;
                    dfs(i, j, arr);
                }
            }
        }
        System.out.println(count);
    }

    public static void dfs(int i, int j, int[][] arr) {
        for (int [] off : offs) {
            int newN = i + off[0];
            int newM = j + off[1];
            if(newN<arr.length && newM<arr[0].length && newN>=0 && newM>=0 && arr[newN][newM]==1){
                arr[newN][newM] = 0;
                dfs(newN,newM,arr);
            }
        }
    }

}
